#ifndef BUS_H
#define BUS_H

#include "Simple_Apu.h"
#include "cartridge.h"
#include "controller.h"
#include "cpu.h"
#include "ppu.h"
#include <QDataStream>

class Bus
{
    friend QDataStream &operator<<(QDataStream &stream, const Bus &bus); // 序列化
    friend QDataStream &operator>>(QDataStream &stream, Bus &bus);       // 反序列化
public:
    Bus();
    void reset();
    void clock(); // 运行一个时钟周期

    void save(quint16 addr, quint8 data);   // 存（写）
    quint8 load(quint16 addr);              // 取（读）
    void SetKeyMap();                       // 设置按键映射

public:
    quint8 ram_data[2048];

public:
    CPU Cpu;
    PPU Ppu;
    Simple_Apu Apu;
    Cartridge cartridge;
    Controller controller_left;
    Controller controller_right;

private:
    // 记录运行的时钟周期数
    // CPU的频率是PPU的1/3，所以每三个周期运行一次CPU的clock
    quint32 clock_count;

    // DMA相关
    quint8 dma_page = 0x00;    // DMA每次将传输一页的数据
    quint8 dma_addr = 0x00;    // page与addr共同构成16位地址
    quint8 dma_data = 0x00;    // CPU将传给OAM的数据
    bool dma_dummy = true;     // 执行DMA需要等待时钟同步（奇数周期才可执行）
    bool dma_transfer = false; // DMA正在执行的标志
};

#endif // BUS_H
